package com.itheima.homework.homework6;

import java.util.concurrent.ArrayBlockingQueue;

/*
【编号2006】假设某公司自产、自存、自销，需要将生产的产品不定时的运到仓库，与此同时，需要将仓库中的产品运往商场中进行销售，
请编写一个程序模拟此过程（主要是仓库存取产品这个过程）。要求：
1、仓库的存量是固定的，可以假设为一个常量，比如10。
2、仓库满的时候，不能再向仓库中存储货物，同理，仓库空的时候，不能取出货物。
3、存货和取货是同时进行的，不要设计成先存满再取完或者存一个取一个这样的效果，但由于存取的不确定性，中间过程中允许出现一部分上述效果。
程序运行效果如下：
生产存入1个单位货物，现在仓库剩余1
生产存入1个单位货物，现在仓库剩余2
消费取出1个单位货物，现在仓库剩余1
消费取出1个单位货物，现在仓库剩余0
生产存入1个单位货物，现在仓库剩余1
生产存入1个单位货物，现在仓库剩余2
生产存入1个单位货物，现在仓库剩余3
生产存入1个单位货物，现在仓库剩余4
生产存入1个单位货物，现在仓库剩余5
消费取出1个单位货物，现在仓库剩余4
消费取出1个单位货物，现在仓库剩余3
消费取出1个单位货物，现在仓库剩余2
消费取出1个单位货物，现在仓库剩余1
消费取出1个单位货物，现在仓库剩余0
。。。
 */
public class Demo6 {
    public static void main(String[] args){
        ArrayBlockingQueue<String> bd = new ArrayBlockingQueue<>(10);

        Foodie f = new Foodie(bd);
        Cooker c = new Cooker(bd);

        f.start();
        c.start();
    }
}
 class Cooker extends Thread {

    private ArrayBlockingQueue<String> bd;

    public Cooker(ArrayBlockingQueue<String> bd) {
        this.bd = bd;
    }
//    生产者步骤：
//            1，判断桌子上是否有汉堡包
//    如果有就等待，如果没有才生产。
//            2，把汉堡包放在桌子上。
//            3，叫醒等待的消费者开吃。

    @Override
    public void run() {
        while (true) {
            try {
                bd.put("汉堡包");
                System.out.println("厨师放入一个汉堡包");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

 class Foodie extends Thread {
    private ArrayBlockingQueue<String> bd;

    public Foodie(ArrayBlockingQueue<String> bd) {
        this.bd = bd;
    }

    @Override
    public void run() {
//        1，判断桌子上是否有汉堡包。
//        2，如果没有就等待。
//        3，如果有就开吃
//        4，吃完之后，桌子上的汉堡包就没有了
//                叫醒等待的生产者继续生产
//        汉堡包的总数量减一

        //套路:
        //1. while(true)死循环
        //2. synchronized 锁,锁对象要唯一
        //3. 判断,共享数据是否结束. 结束
        //4. 判断,共享数据是否结束. 没有结束
        while (true) {
            try {
                String take = bd.take();
                System.out.println("吃货将" + take + "拿出来吃了");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}